# -*- coding: utf-8 -*-
# @Time: 2025/11/9 18:05
# @Author: subencai
# @Email: 2080981057@qq.com
# @File: studentapi.py
# @Project: flaskProject
# @Description:


# from . import stu_bp
# from flask_restful import Api,Resource
# from Lib.resp import my_response
#
#
# api = Api(stu_bp)
#
# class Student(Resource):
#     def get(self,id = None):
#         print(f"id is {id}")
#         return my_response(message="this is get func")
#     def post(self):
#         return my_response(message="this is post func")
#     def put(self,id):
#         return my_response(message="this is put func")
#     def delete(self,id):
#         return my_response(message="this is delete func")
#
# api.add_resource(Student,"/student")
# api.add_resource(Student,"/student/<int:id>",endpoint = "studentid")
#


# 蓝图（Blueprint）是 Flask 中独立于 API 框架的核心功能，
# 它的本质是「路由和视图的集合」，无论是否使用 flask-restful 这类 API 工具，
# 只要需要拆分路由、管理不同模块，都可以用蓝图。
# 一句话总结：蓝图 ≠ API，API 可以用蓝图，但蓝图不止用于 API
# 蓝图的核心作用：把不同功能的路由（比如用户模块、商品模块、订单模块）拆分开，
# 避免所有路由都堆在主应用里，让代码更清晰。
# 是否用 API 不影响蓝图的使用：
# 即使只写传统的 @app.route 路由，也可以用蓝图拆分
# （比如项目中的 student01.py/student02.py，就是用蓝图管理的传统路由）；
# 用 flask-restful 时，蓝图只是用来给 API 统一加前缀（比如 /stu），
# 方便管理，API 本身的逻辑和蓝图是两回事。

# 以上是雏形，下面升级为有具体功能的蓝图：

# router/student/studentapi.py
from . import stu_bp
from flask_restful import Api, Resource
from flask import request  # 用于获取请求参数
from Lib.resp import my_response

# 模拟数据库（内存存储，重启服务后数据会重置）
# 数据格式：{id: {name: "张三", age: 20, major: "计算机"}}
# students = {
#     1: {"name": "张三", "age": 20, "major": "计算机"},
#     2: {"name": "李四", "age": 21, "major": "软件工程"}
# }
# next_id = 3  # 用于生成新学生的ID
#
#
# api = Api(stu_bp)
#
# class Student(Resource):
#     # 1. 查询学生（支持查单个或全部）
#     def get(self, id=None):
#         if id:
#             # 查单个学生：根据ID查询
#             student = students.get(id)
#             if not student:
#                 return my_response(code=404, message=f"ID为{id}的学生不存在")
#             return my_response(data=student, message="查询成功")
#         else:
#             # 查全部学生：返回所有数据
#             return my_response(data=students, message="查询全部成功")
#
#     # 2. 新增学生（不需要ID，自动生成）
#     def post(self):
#         global next_id  # 使用全局变量生成ID
#         # 获取POST请求中的JSON数据（前端传参）
#         data = request.get_json()
#         # 校验必填参数
#         if not data or not data.get("name"):
#             return my_response(code=400, message="姓名不能为空")
#         # 构建新学生数据
#         new_student = {
#             "name": data.get("name"),
#             "age": data.get("age", 0),  # 默认为0
#             "major": data.get("major", "未知")  # 默认为未知
#         }
#         # 存入内存数据库
#         students[next_id] = new_student
#         # 更新下一个ID
#         current_id = next_id
#         next_id += 1
#         return my_response(data={"id": current_id, **new_student}, message="新增成功")
#
#     # 3. 更新学生信息（需要ID）
#     def put(self, id):
#         data = request.get_json()
#         if not data:
#             return my_response(code=400, message="数据不能为空")
#         # 如果 ID 不存在，就新增一条；存在则更新
#         if id not in students:
#             students[id] = data  # 直接新增指定 ID 的数据
#             return my_response(data=students[id], message=f"ID={id}的学生已新增")
#         else:
#             students[id].update(data)  # 存在则更新
#             return my_response(data=students[id], message=f"ID={id}的学生已更新")
#     # 4. 删除学生（需要ID）
#     def delete(self, id):
#         # 检查学生是否存在
#         if id not in students:
#             return my_response(code=404, message=f"ID为{id}的学生不存在")
#         # 从内存数据库中删除
#         deleted = students.pop(id)
#         return my_response(data=deleted, message=f"ID为{id}的学生删除成功")
#
#
# # 注册接口：注意路径与蓝图前缀的拼接
# api.add_resource(Student, "/student")  # 对应GET(查全部)、POST(新增)
# api.add_resource(Student, "/student/<int:id>", endpoint="studentid")  # 对应GET(查单个)、PUT、DELETE


# router/student/studentapi.py
from . import stu_bp
from flask_restful import Api, Resource, reqparse
from models import Student  # 导入学生模型
from server import db  # 导入数据库实例
from Lib.resp import my_response  # 保持统一响应格式

api = Api(stu_bp)

# 解析请求参数
parser = reqparse.RequestParser()
parser.add_argument('name', type=str, required=True, help='姓名不能为空')
parser.add_argument('age', type=int)
parser.add_argument('major', type=str)


class StudentResource(Resource):
    # 获取所有学生（GET /stu/student）
    def get(self):
        students = Student.query.all()  # 从数据库查询所有学生
        data = {str(s.id): {'name': s.name, 'age': s.age, 'major': s.major} for s in students}
        return my_response(code=200, message='查询成功', data=data)

    # 新增学生（POST /stu/student）
    def post(self):
        args = parser.parse_args()
        new_stu = Student(
            name=args['name'],
            age=args['age'],
            major=args['major']
        )
        db.session.add(new_stu)  # 添加到数据库会话
        db.session.commit()  # 提交事务
        return my_response(code=201, message='新增成功', data={'id': new_stu.id})


class StudentSingleResource(Resource):
    # 获取单个学生（GET /stu/student/<id>）
    def get(self, id):
        stu = Student.query.get(id)  # 根据ID查询
        if not stu:
            return my_response(code=404, message='学生不存在')
        data = {'name': stu.name, 'age': stu.age, 'major': stu.major}
        return my_response(code=200, message='查询成功', data=data)

    # 更新学生（PUT /stu/student/<id>）
    def put(self, id):
        stu = Student.query.get(id)
        if not stu:
            return my_response(code=404, message='学生不存在')
        args = parser.parse_args()
        stu.name = args['name']
        stu.age = args['age']
        stu.major = args['major']
        db.session.commit()  # 提交更新
        return my_response(code=200, message='更新成功')

    # 删除学生（DELETE /stu/student/<id>）
    def delete(self, id):
        stu = Student.query.get(id)
        if not stu:
            return my_response(code=404, message='学生不存在')
        db.session.delete(stu)  # 删除
        db.session.commit()
        return my_response(code=200, message='删除成功')


# 注册路由（保持原路径不变，前端无需修改）
api.add_resource(StudentResource, '/student')
api.add_resource(StudentSingleResource, '/student/<int:id>')